package cn.dogger.thread.config;

import org.springframework.stereotype.Component;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池
 * @author dogger
 * 2022/11/14 17:22
 */
@Component
public class ThreadPool {

    /**
     * 拒绝策略
     * 1. new ThreadPoolExecutor.AbortPolicy
     * 当任务添加到线程池中被拒绝时，直接丢弃任务，并抛出RejectedExecutionException异常。
     * 2. new ThreadPoolExecutor.DiscardPolicy
     * 当任务添加到线程池中被拒绝时，丢弃被拒绝的任务，不抛异常。
     * 3. new ThreadPoolExecutor.DiscardOldestPolicy
     * 当任务添加到线程池中被拒绝时，丢弃任务队列中最旧的未处理任务，然后将被拒绝的任务添加到等待队列中。
     * 4. new ThreadPoolExecutor.CallerRunsPolicy
     * 被拒绝任务的处理程序，直接在execute方法的调用线程中运行被拒绝的任务。总结：就是被拒绝的任务，直接在主线程中运行，不再进入线程池。
     */
    private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(5, 20,
            60L, TimeUnit.SECONDS,
            new SynchronousQueue<>(), new NamedThreadFactory("ThreadPool"), new ThreadPoolExecutor.CallerRunsPolicy());

    /**
     * 将任务交给线程池管理
     * @param runnable 任务
     */
    public static void execute(Runnable runnable) {
        THREAD_POOL_EXECUTOR.execute(runnable);
    }
}
